package com.clstu.reflection;

import com.clstu.cat.Cat;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * 这是一个反射机制的入门案例,(通过配置文件产生对应的类并调用指定的方法)
 */
public class Question {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        new Cat().hi();//传统方法,在代码中指定调用具体哪个方法

        //创建properties对象并用文件输出流加载
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\re.properties"));
        String classfullpath = properties.getProperty("classfullpath");
        String methodName = properties.getProperty("method");

        //得到对应的类名和方法名,(但是是字符串类型)
        System.out.println(classfullpath+"===="+methodName);

        //因为是字符串类型,所以很难去直接创建这个对象
        //于是有了反射机制

        //1.类加载,返回Class类型对象cls
        Class cls = Class.forName(classfullpath);

        //2.通过cls对象得到目标类的对象实例
        Object o = cls.newInstance();
        System.out.println(o.getClass());

        //3.通过cls对象得到目标实例的方法对象(注意:方法也是被当做对象来看待的)
        Method method = cls.getMethod(methodName);

        //4.调用方法(传统:对象.方法    反射:方法.invoke(对象))
        method.invoke(o);
    }
}
